﻿using System.Security.Cryptography;
using System.Text;

namespace Tool.Utils
{
    public static class FileHelper
    {
        /// <summary>
        /// 计算字节数组的 MD5 哈希值，并返回其小写十六进制字符串表示。
        /// </summary>
        /// <param name="source">要计算哈希值的字节数组</param>
        /// <returns>32位小写十六进制字符串</returns>
        public static string Md5(byte[] source)
        {
            // 创建 MD5 哈希算法实例
            using (MD5 md5 = MD5.Create())
            {
                // 计算哈希值
                byte[] hashBytes = md5.ComputeHash(source);

                // 将哈希字节数组转换为十六进制字符串
                // 使用 StringBuilder 高效地构建字符串
                StringBuilder sb = new StringBuilder(32); // MD5 固定32位
                foreach (byte b in hashBytes)
                {
                    sb.Append(b.ToString("x2")); // "x2" 格式化为两位小写十六进制数
                }
                return sb.ToString();
            }
        }

        /// <summary>
        /// 根据文件ID、时间戳和密钥生成 FastDFS 下载 token。
        /// </summary>
        /// <param name="remote_filename">远程文件名 (fileId)</param>
        /// <param name="ts">时间戳 (Unix 时间戳，单位：秒)</param>
        /// <param name="secret_key">密钥</param>
        /// <returns>生成的 MD5 token 字符串</returns>
        public static string GetToken(string remote_filename, int ts, string secret_key)
        {
            // 将字符串转换为 UTF-8 字节数组
            byte[] bsFilename = Encoding.UTF8.GetBytes(remote_filename);
            byte[] bsKey = Encoding.UTF8.GetBytes(secret_key);
            byte[] bsTimestamp = Encoding.UTF8.GetBytes(ts.ToString());

            // 创建一个新数组，长度为三个字节数组的总和
            byte[] buff = new byte[bsFilename.Length + bsKey.Length + bsTimestamp.Length];

            // 使用 Buffer.BlockCopy 或 Array.Copy 将三个字节数组拼接起来
            // Array.Copy(sourceArray, sourceIndex, destinationArray, destinationIndex, length)
            Array.Copy(bsFilename, 0, buff, 0, bsFilename.Length);
            Array.Copy(bsKey, 0, buff, bsFilename.Length, bsKey.Length);
            Array.Copy(bsTimestamp, 0, buff, bsFilename.Length + bsKey.Length, bsTimestamp.Length);

            // 计算拼接后字节数组的 MD5 值，并返回十六进制字符串
            return Md5(buff);
        }

        public static string GetFileHost(string clientName, string groupName)
        {
            switch (clientName)
            {
                case "zwy":
                    if (groupName == "云南")
                    {
                        return "https://yunnan-image.gwhome.com.cn";
                    }
                    return "https://image.gwhome.com.cn";
                case "sh":
                    return "https://shanghai.gwhome.com.cn";
                case "sx":
                    return "https://beijing.gwhome.com.cn:26443";
                case "yn":
                    return "https://yngwbx.gwhome.com.cn:53000";
                default:
                    return "https://image.gwhome.com.cn";
            }
        }
    }


    public static class HttpUtil
    {
        // 使用 static HttpClient 实例以获得最佳性能
        private static readonly HttpClient httpClient = new HttpClient();

        public static async Task<byte[]> DownloadBytesAsync(string url)
        {
            try
            {
                // 发送 GET 请求并获取响应流
                HttpResponseMessage response = await httpClient.GetAsync(url);
                response.EnsureSuccessStatusCode(); // 确保请求成功 (状态码 2xx)
                return await response.Content.ReadAsByteArrayAsync();
            }
            catch (HttpRequestException e)
            {
                // 处理网络请求异常
                Console.WriteLine($"请求失败: {e.Message}");
                throw;
            }
        }
    }
}
